#include "persistencia.h"
#include "construtorIndice.h"
#include <string.h>

void gravaRegistroArgBanco(RegAluno regImportacao, FILE *file){
  char buffer[1024];
  serializaRegistroImportacao(regImportacao,buffer);
  fwrite(buffer,strlen(buffer),1,file);
}

void gravaChavePrimariaArgIndicePrimario(ChavePrimaria chavePrimaria, FILE *file){
  char buffer[20];
  serializaChavePrimaria(chavePrimaria,buffer);    
  fwrite(buffer,strlen(buffer),1,file);
}

void gravaChaveSecundariaNomeCurso(ChaveSecundaria chaveSecundaria, FILE *file){
  char buffer[200];
  serializaChaveSegundaria(chaveSecundaria,buffer);
  fwrite(buffer,strlen(buffer),1,file);
}

void gravarListaSegundariaNomeArq(ListaChaveSecundariaNome *inicioListaNome, ArquivosPersistencia *arquivos){    
    ListaChaveSecundariaNome *p = inicioListaNome;
    
    while(p != NULL){     
      gravaChaveSecundariaNomeCurso(p->chaveSecundaria,arquivos->fileIndiceSegundarioNome);
      p = p->proximo;
    } 
    
}

void gravarListaPrimariaArq(ListaChavePrimaria *inicioListaInscricao, ArquivosPersistencia *arquivos){
    ChavePrimaria chavePrimaria;            
    ListaChavePrimaria *p = inicioListaInscricao;
    
    while(p != NULL){
      chavePrimaria.inscricao = p->chavePrimaria.inscricao;
      chavePrimaria.byteOffset = p->chavePrimaria.byteOffset;
      gravaChavePrimariaArgIndicePrimario(chavePrimaria,arquivos->fileIndicePrimario);
      p = p->proximo;
    } 
}

void gravarElementoListaInvertida(ElementoListaInvertida elemento, FILE *file){
  char buffer[1000];
  int distancia = distanciaElementoAteComecoListaInvertida(elemento.proxNome);
  serializaElemento(elemento, distancia, buffer);
  fwrite(buffer,strlen(buffer),1,file);
}

void gravarListaInvertidaArq(ListaInvertida *inicioListaInvertida, ArquivosPersistencia *arquivos){
  
  ListaInvertida *p = inicioListaInvertida;
  
  while(p != NULL){
    gravarElementoListaInvertida(p->elemento,arquivos->fileIndiceListaInvertida);
    p = p->proximo;
  }
    
}

int distanciaElementoAteComecoListaInvertida(ElementoListaInvertida *elemento){
  if(elemento == NULL){
    return -1;
  }
  
  int contador = 0;
  
  ListaInvertida *p = inicioListaInvertida;
  while(&p->elemento != elemento){
    contador++;
    p = p->proximo;
  }
  
  return contador;
}